home *** CD-ROM | disk | FTP | other *** search
- // Direct3D RM サンプルプログラム
- // Cube.cpp
-
- #include "stdafx.h"
- #include "Cube.h"
- #define APPNAME "Cube"
-
- LRESULT CALLBACK WndProc(HWND, UINT, UINT, LONG);
- BOOL bActive = FALSE;
-
- IDirectDraw *lpDD=NULL; // DirectDrawオブジェクト
- IDirectDrawSurface *lpDDPrimary=NULL; // プライマリサーフェス
- IDirectDrawSurface *lpDDBack=NULL; // バックサーフェス
-
- IDirect3D2 *lpD3D=NULL; // Direct3Dオブジェクト
- IDirect3DDevice2 *lpD3DDev=NULL; // Direct3Dデバイス
- IDirectDrawSurface *lpDDZ=NULL; // Zバッファ
-
- IDirect3DRM3 *lpD3DRM=NULL; // Direct3D RMオブジェクト
- IDirect3DRMDevice3 *lpD3DRMDev=NULL; // Direct3D RMデバイス
-
- IDirect3DRMFrame3 *lpD3DRMScene=NULL; // シーンフレーム
- IDirect3DRMFrame3 *lpD3DRMCamera=NULL; // カメラフレーム
- IDirect3DRMViewport2 *lpD3DRMView=NULL; // ビューポート
- IDirect3DRMFrame3 *lpD3DRMLight=NULL; // ライトフレーム
-
- IDirect3DRMFrame3 *lpD3DRMCube=NULL; // キューブオブジェクト
-
- int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPSTR lpCmdLine, int nCmdShow)
- {
- WNDCLASS wc;
- HWND hWnd;
- MSG msg;
-
- wc.style=CS_HREDRAW|CS_VREDRAW;
- wc.lpfnWndProc=WndProc;
- wc.cbClsExtra=0;
- wc.cbWndExtra=0;
- wc.hInstance=hInstance;
- wc.hIcon=LoadIcon(hInstance, IDI_APPLICATION);
- wc.hCursor=LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground=(HBRUSH)GetStockBrush(BLACK_BRUSH);
- wc.lpszMenuName=0;
- wc.lpszClassName=APPNAME;
-
- RegisterClass(&wc);
-
- // ウィンドウクラスの登録
- hWnd=CreateWindowEx(0, APPNAME, APPNAME, WS_POPUP, 0, 0,
- GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
- NULL, NULL, hInstance, NULL);
-
- if(!hWnd) return FALSE;
-
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
-
- // DirectDrawの初期化
- if(!InitDDraw(hWnd)) return FALSE;
- // Direct3Dの初期化
- if(!InitD3D(hWnd)) return FALSE;
- // シーンの初期化
- if(!BuildScene(lpD3DRM, lpD3DRMDev, lpD3DRMView, lpD3DRMScene, lpD3DRMCamera)) return FALSE;
-
- // 初期化終了
- bActive=TRUE;
-
- Render();
- BOOL update;
- // メッセージポンプ
- while(TRUE){
- if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
- if(!GetMessage(&msg, NULL, 0, 0 )){
- return msg.wParam;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- update=FALSE;
- if(bActive){
- if(GetAsyncKeyState(VK_UP)){
- lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0.1));
- update=TRUE;
- }
- if(GetAsyncKeyState(VK_DOWN)){
- lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(1), D3DVAL(0), D3DVAL(0), -D3DVAL(0.1));
- update=TRUE;
- }
- if(GetAsyncKeyState(VK_LEFT)){
- lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.1));
- update=TRUE;
- }
- if(GetAsyncKeyState(VK_RIGHT)){
- lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(0), D3DVAL(1), D3DVAL(0), -D3DVAL(0.1));
- update=TRUE;
- }
- if(update) Render();
- }
- }
- }
-
- long FAR PASCAL WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch(message){
- case WM_ACTIVATEAPP:
- bActive=(BOOL)wParam;
- if(bActive && lpDD){
- ResumeSurfaces();
- Render();
- }
- break;
- case WM_CREATE:
- break;
- case WM_SETCURSOR:
- SetCursor(NULL);
- return TRUE;
- case WM_KEYDOWN:
- switch(wParam){
- case VK_ESCAPE:
- DestroyWindow(hWnd);
- break;
- }
- return TRUE;
- case WM_DESTROY:
- bActive=FALSE;
- ReleaseObjects();
- PostQuitMessage(0);
- break;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
-
- // オブジェクトの開放
- void ReleaseObjects()
- {
- RELEASE(lpD3DRMCube);
- RELEASE(lpD3DRMLight);
- RELEASE(lpD3DRMView);
- RELEASE(lpD3DRMCamera);
- RELEASE(lpD3DRMScene);
- RELEASE(lpD3DRMDev);
- RELEASE(lpD3DRM);
- RELEASE(lpD3DDev);
- RELEASE(lpDDZ);
- RELEASE(lpD3D);
- RELEASE(lpDDBack);
- RELEASE(lpDDPrimary);
- RELEASE(lpDD);
- }
-
- // DirectDrawドライバの列挙と選定
- BOOL FAR PASCAL DDEnumCallback(GUID FAR *lpGUID, LPSTR lpDriverDesc,
- LPSTR lpDriverName, LPVOID lpContext)
- {
- LPDIRECTDRAW lpDD;
- DDCAPS DriverCaps, HELCaps;
-
- if(lpGUID){
- // DirectDrawオブジェクトを試しに作成
- if(DirectDrawCreate(lpGUID, &lpDD, NULL)!=DD_OK) return DDENUMRET_OK;
-
- memset(&DriverCaps,0,sizeof(DDCAPS));
- DriverCaps.dwSize=sizeof(DDCAPS);
- memset(&HELCaps, 0, sizeof(DDCAPS));
- HELCaps.dwSize=sizeof(DDCAPS);
-
- // 能力を取得
- if(lpDD->GetCaps(&DriverCaps, &HELCaps)!=DD_OK){
- lpDD->Release();
- return DDENUMRET_OK;
- }
-
- // 3Dアクセラレーションが利用できる場合で,
- // さらにテクスチャが使える場合は,それを採用
- if((DriverCaps.dwCaps&DDCAPS_3D)
- &&(DriverCaps.ddsCaps.dwCaps&DDSCAPS_TEXTURE)){
- *(LPDIRECTDRAW*)lpContext = lpDD;
- return DDENUMRET_CANCEL;
- }
- lpDD->Release();
- }
- // 他のドライバを試す
- return DDENUMRET_OK;
- }
-
- // DirectDrawの初期化
- BOOL InitDDraw(HWND hWnd)
- {
- // DirectDrawドライバを列挙
- if(DirectDrawEnumerate(DDEnumCallback,&lpDD)!=DD_OK) return FALSE;
-
- // HALが利用できない場合,現在のアクティブなドライバを使う
- if(!lpDD)
- if(DirectDrawCreate(NULL, &lpDD, NULL)!=DD_OK) return FALSE;
-
- // 協調レベルの設定
- lpDD->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
-
- // 画面モードの設定
- lpDD->SetDisplayMode(640, 480, 16);
-
- // サーフェイスの作成
- DDSURFACEDESC ddsd;
- DDSCAPS ddscaps;
-
- ZeroMemory(&ddsd, sizeof(ddsd));
- ZeroMemory(&ddscaps, sizeof(ddscaps));
-
- ddsd.dwSize=sizeof(ddsd);
- ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
- ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_3DDEVICE|
- DDSCAPS_FLIP|DDSCAPS_COMPLEX;
- ddsd.dwBackBufferCount=1;
-
- lpDD->CreateSurface(&ddsd,&lpDDPrimary,NULL);
-
- ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
- lpDDPrimary->GetAttachedSurface(&ddscaps,&lpDDBack);
-
- DDBLTFX ddbltfx;
- ZeroMemory(&ddbltfx, sizeof(DDBLTFX));
- ddbltfx.dwSize=sizeof(DDBLTFX);
- lpDDPrimary->Blt(NULL, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);
- lpDDBack->Blt(NULL, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);
-
- return TRUE;
- }
-
- // DirectDraw初期化エラー処理
- BOOL InitDDError(HWND hWnd)
- {
- ReleaseObjects();
- MessageBox(hWnd, "Initialize Error", "DirectDraw Initialize", MB_OK|MB_ICONHAND);
- DestroyWindow(hWnd);
- return FALSE;
- }
-
- // Direct3Dデバイスを列挙する
- HRESULT FAR PASCAL D3DEnumCallback(LPGUID lpGuid, LPSTR lpDeviceDescription,
- LPSTR lpDeviceName, LPD3DDEVICEDESC lpHWDesc, LPD3DDEVICEDESC lpHELDesc,
- LPVOID lpContext)
- {
- LPGUID *lpguid=(LPGUID*)lpContext;
-
- // ハードウェアデバイスか?
- if(lpHWDesc->dcmColorModel){
- // ハードウェアならGUIDを保存して採用
- *lpguid=lpGuid;
- return D3DENUMRET_CANCEL;
- }
- return D3DENUMRET_OK;
- }
-
- // Direct3Dの初期化
- BOOL InitD3D( HWND hWnd )
- {
- BOOL bHal;
- LPGUID lpguid=NULL;
- DDSURFACEDESC ddsd;
-
- // Direct3Dオブジェクトの取得
- if(lpDD->QueryInterface(IID_IDirect3D2, (void**)&lpD3D )!=DD_OK) return InitD3DError(hWnd);
-
- // デバイスのGUIDの取得
- lpD3D->EnumDevices(D3DEnumCallback, &lpguid);
-
- bHal=lpguid!=NULL;
-
- // Zバッファの作成
- memset(&ddsd, 0, sizeof(DDSURFACEDESC));
- ddsd.dwSize=sizeof(DDSURFACEDESC);
- ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS|DDSD_ZBUFFERBITDEPTH;
- ddsd.dwWidth=640;
- ddsd.dwHeight=480;
- ddsd.dwZBufferBitDepth=16;
- ddsd.ddsCaps.dwCaps=DDSCAPS_ZBUFFER;
- ddsd.ddsCaps.dwCaps|=(bHal?DDSCAPS_VIDEOMEMORY:DDSCAPS_SYSTEMMEMORY);
- lpDD->CreateSurface(&ddsd, &lpDDZ, NULL);
-
- // Zバッファをバックバッファにアタッチ
- lpDDBack->AddAttachedSurface(lpDDZ);
-
- if(bHal){
- // ハードウェアデバイスの作成
- if(lpD3D->CreateDevice(*lpguid, lpDDBack, &lpD3DDev)!=D3D_OK)
- return InitD3DError(hWnd);
- } else {
- // もしもHALではなかったらをMMXデバイスの作成
- if(lpD3D->CreateDevice(IID_IDirect3DMMXDevice, lpDDBack, &lpD3DDev)!=D3D_OK)
- return InitD3DError(hWnd);
- }
-
- // Direct3D RMオブジェクトの生成
- IDirect3DRM *lpOldD3DRM;
- if(Direct3DRMCreate(&lpOldD3DRM)!=D3D_OK) return InitD3DError(hWnd);
- HRESULT result=lpOldD3DRM->QueryInterface(IID_IDirect3DRM3, (void **)&lpD3DRM);
- RELEASE(lpOldD3DRM);
- if(result!=D3D_OK) return InitD3DError(hWnd);
-
- // Direct3D RMデバイスの作成
- if(lpD3DRM->CreateDeviceFromD3D(lpD3D, lpD3DDev, &lpD3DRMDev)!=D3D_OK)
- return InitD3DError(hWnd);
-
- // シーンフレームの作成
- lpD3DRM->CreateFrame(NULL, &lpD3DRMScene);
- lpD3DRMScene->SetPosition(NULL, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0));
-
- // カメラフレームの作成
- lpD3DRM->CreateFrame(lpD3DRMScene, &lpD3DRMCamera);
- lpD3DRMCamera->SetPosition(lpD3DRMScene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-10.0));
-
- // ビューポートの作成
- if(lpD3DRM->CreateViewport(lpD3DRMDev, lpD3DRMCamera, 0, 0,
- lpD3DRMDev->GetWidth(), lpD3DRMDev->GetHeight(), &lpD3DRMView)!=DD_OK)
- return InitD3DError( hWnd );
-
- // バッククリップの設定
- if(lpD3DRMView->SetBack(D3DVAL(500.0))!=DD_OK ) return InitD3DError(hWnd);
-
- return TRUE;
- }
-
- // Direct3D初期化エラー処理
- BOOL InitD3DError(HWND hWnd)
- {
- ReleaseObjects();
- MessageBox(hWnd, "Initialize Error", "Direct3D Initialize", MB_OK|MB_ICONHAND);
- DestroyWindow(hWnd);
- return FALSE;
- }
-
- // サーフェスの修復
- BOOL ResumeSurfaces()
- {
- lpDDPrimary->Restore();
- lpDDZ->Restore();
- return TRUE;
- }
-
- // 頂点のリスト
- D3DVECTOR vertices[]={
- D3DVAL(-0.5), D3DVAL(-0.5), D3DVAL(-0.5),
- D3DVAL(-0.5), D3DVAL(-0.5), D3DVAL(0.5),
- D3DVAL(-0.5), D3DVAL(0.5), D3DVAL(-0.5),
- D3DVAL(-0.5), D3DVAL(0.5), D3DVAL(0.5),
- D3DVAL(0.5), D3DVAL(-0.5), D3DVAL(-0.5),
- D3DVAL(0.5), D3DVAL(-0.5), D3DVAL(0.5),
- D3DVAL(0.5), D3DVAL(0.5), D3DVAL(-0.5),
- D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5)
- };
-
- // 法線ベクトルのリスト
- D3DVECTOR normals[]={
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
- D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
- D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
- D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
- D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0)
- };
-
- // フェースリスト
- DWORD face[]={
- 4, 1, 0, 5, 1, 7, 2, 3, 3,
- 4, 2, 4, 3, 5, 7, 6, 6, 7,
- 4, 5, 8, 4, 9, 6, 10, 7, 11,
- 4, 0, 12, 2, 13, 6, 14, 4, 15,
- 4, 0, 16, 4, 17, 5, 18, 1, 19,
- 4, 0, 20, 1, 21, 3, 22, 2, 23,
- 0};
-
- BOOL BuildScene(IDirect3DRM3 *lpD3DRM, IDirect3DRMDevice3 *lpD3DRMDev,
- IDirect3DRMViewport2 *lpD3DRMView, IDirect3DRMFrame3 *lpD3DRMScene,
- IDirect3DRMFrame3 *lpD3DRMCamera)
- {
-
- // クオリティの設定
- lpD3DRMDev->SetShades(32);
- lpD3DRM->SetDefaultTextureColors(256);
- lpD3DRM->SetDefaultTextureShades(32);
- lpD3DRMDev->SetDither(TRUE);
- lpD3DRMDev->SetTextureQuality(D3DRMTEXTURE_LINEAR);
-
- // 光源のフレーム作成
- lpD3DRM->CreateFrame(lpD3DRMScene, &lpD3DRMLight);
- lpD3DRMLight->SetPosition(lpD3DRMScene, D3DVAL(1.0), D3DVAL(1.0),D3DVAL(-3.0));
-
- // 光源の作成
- LPDIRECT3DRMLIGHT pLight;
-
- // 点ライト
- lpD3DRM->CreateLightRGB(D3DRMLIGHT_POINT, D3DVAL(0.8), D3DVAL(0.8),
- D3DVAL(0.8), &pLight);
- lpD3DRMLight->AddLight(pLight);
- RELEASE(pLight);
-
- // 環境ライト
- lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT, D3DVAL(0.2),
- D3DVAL(0.2), D3DVAL(0.2), &pLight);
- lpD3DRMLight->AddLight(pLight);
- RELEASE(pLight);
-
- // キューブの作成
- lpD3DRM->CreateFrame(lpD3DRMScene, &lpD3DRMCube);
- lpD3DRMCube->SetPosition(lpD3DRMScene, D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(0.0));
- lpD3DRMCube->SetOrientation(lpD3DRMScene, D3DVAL(0.0), D3DVAL(-0.1), D3DVAL(0.3),
- D3DVAL(0), D3DVAL(0.3), D3DVAL(0.1));
- LPDIRECT3DRMMESHBUILDER3 builder;
- LPDIRECT3DRMTEXTURE3 texture;
-
- // テクスチャの読み込み
- lpD3DRM->LoadTexture("TEXTURE.BMP", &texture);
-
- // メッシュの作成
- lpD3DRM->CreateMeshBuilder(&builder);
- builder->AddFaces(8, vertices, 6*4, normals, face, NULL);
- builder->SetColor(D3DRGBA(1.0,1.0,1.0,0.8));
- builder->SetQuality(D3DRMRENDER_GOURAUD);
- builder->Scale(D3DVAL(2.0), D3DVAL(2.0), D3DVAL(2.0));
-
- // テクスチャ座標の設定
- builder->SetTextureCoordinates(0, D3DVAL(0), D3DVAL(1));
- builder->SetTextureCoordinates(1, D3DVAL(1), D3DVAL(1));
- builder->SetTextureCoordinates(2, D3DVAL(0), D3DVAL(0));
- builder->SetTextureCoordinates(3, D3DVAL(1), D3DVAL(0));
- builder->SetTextureCoordinates(4, D3DVAL(1), D3DVAL(1));
- builder->SetTextureCoordinates(5, D3DVAL(0), D3DVAL(1));
- builder->SetTextureCoordinates(6, D3DVAL(1), D3DVAL(0));
- builder->SetTextureCoordinates(7, D3DVAL(0), D3DVAL(0));
- builder->SetTexture(texture);
- builder->SetPerspective(TRUE);
-
- lpD3DRMCube->AddVisual(builder);
-
- RELEASE(texture);
- RELEASE(builder);
-
- return TRUE;
- }
-
- void Render()
- {
- // ビューのクリア
- lpD3DRMView->Clear(D3DRMCLEAR_ALL);
- // レンダリング
- lpD3DRMView->Render(lpD3DRMScene);
- // レンダリングした結果をバックバッファへコピー
- lpD3DRMDev->Update();
- // フリッピング
- lpDDPrimary->Flip(NULL, DDFLIP_WAIT);
- }
-